Suchen mit regulären Ausdrücken (GREP)

(Get Regular ExPression, Regulärer Ausdruck). GREP sucht nach Mustern im Text, deren genaue Zusammensetzung nicht bekannt ist, aber bestimmten Regeln gehorcht. Reguläre Ausdrücke sind Kombinationen von normalen Zeichen und Wildcards. Wildcards stehen dabei nicht für das Zeichen selbst, sondern für ein beliebiges Zeichen. Die Wildcard ist der Punkt `.'. Er steht für genau ein beliebiges Zeichen. Der Stern `*' gibt an, daß dieses Zeichen nullmal bis beliebig oft auftreten darf (`.*'). Das Plus `+' gibt an, daß es mindestens einmal bis beliebig oft auftreten darf (`.+'). Wenn das Zeichen aber nur in einem eingeschränkten Bereich auftreten darf, verwendet man den Klammerausdruck mit Bereichsangabe; `[ ]'. `[A-Z]' sagt, daß das Zeichen nur im Bereich `A-Z' auftreten darf. Ebenso gilt auch `[a-z]', `[0-9]' oder auch `[a-g,H-M,0-4]'. Wenn ein Zeichen in einem bestimmten Bereich nicht auftreten soll, so wird das Caret `∧' vorangestellt (`[∧A-E]'). Wenn die Wildcard selbst im Text als Zeichen erkannt werden soll, so muß sie quotiert werden. Quotieren bedeutet das Voranstellen eines Backslashes ` \' vor das Sonderzeichen. Wenn Sie also den Punkt selbst suchen wollen, so lautet der Ausdruck ` \.'.

Beispiel:
In einem Text sollen die Worte `Qualle', `Quelle' und `Quälgeist' gefunden werden. Das Suchmuster müßte also `[Q]u.[l]' lauten. Der Inhalt der eckigen Klammern steht dabei für genau ein Zeichen, das in diesem Falle nur ein `Q' und ein `l' an einer beliebigen Stelle hinter dem `Q' sein darf. Hinter dem `Q' steht `u.'. Der Punkt steht dabei für ein beliebiges Zeichen. Die o.g. Worte erfüllen das Suchmuster. Es kommen `Q' und `l' vor, dazwischen stehen in diesem Falle unterschiedlichen Buchstabenkombinationen, hier `ua', `ue' und `uä'.

Ein zweites Beispiel:
Sie möchten in Ihrem Text alle `/' finden, denen eine Ziffer voransteht, und denen ein Buchstabe folgt. also z.B. `22/BR' nicht aber `138/0.5'. Das Suchmuster lautet dann `[0-9]/[a-z]'. Vor dem `/' sind nur Ziffern, hinter dem `/' nur Buchstaben erlaubt. Als zweite Lösung bietet sich `:d/:a' an. Erklärung s.u.

Ein drittes Beispiel:
Es sollen alle Worte gefunden werden, die mit einer Ziffer beginnen. Also z.B. `7UP'. Da davor ein Leerzeichen erwartet wird, lautet das Suchmuster dann `: [0-9]'.

Viertes Beispiel:
Es sollen alle Interpunktionen am Zeilenende gefunden werden. z.B. Satzendekennung `.'. Geben Sie ` \.$' ein. Bedenken Sie, daß der `.' ein Sonderzeichen ist und quotiert werden muß. Das `$'-Zeichen steht für das Zeilenende, und muß natürlich auch am Ende des regulären Ausdrucks stehen. Wenn Sie alle Interpunktionen am Zeilenende finden wollen, geben Sie `[,;.:!?]$' ein. (Dies ist tatsächlich kein COMIC-Schimpfwort!)
Wie beim Suchen, so ist auch beim Ersetzen der Einsatz von Wildcards möglich. Als Wildcard wird beim Ersetzen mit regulären Ausdrücken ` \&' akzeptiert. Diese beiden Zeichen werden beim Ersetzen durch das Gefundene ersetzt. Damit ist es möglich variable Fundstellen durch sich selbst und zusätzliche Zeichenketten davor oder dahinter zu ersetzen. Beispiel:
Suchen : ` \[.*OK.* \]'
Ersatz : `! \&!'
Fundstellen: `[OK]', `[ OK ]', `[xxOK hh]'
Ergibt : `![OK]!', `![ OK ]!', `![xxOK hh]!'

Die Hochkommata vor und hinter den Beispielen werden selbstverständlich nicht eingegeben, sie dienen nur der Kenntlichmachung innerhalb dieser Dokumentation.

Der Reguläre Ausdruck beschreibt das zu suchende Muster. Die Suchmöglichkeiten entsprechen aus technischen Gründen nicht dem vollen Leistungsumfang des UNIX*-Programms GREP.

Die folgende Tabelle beinhaltet eine Aufstellung derjenigen Sonderzeichen, mit denen eine recht präzise Formulierung der Suchkriterien möglich ist:

Regel Erklärung
`.' Der Punkt steht für ein beliebiges Zeichen.
`∧' Das Caret steht für den Zeilenanfang (implementiert, aber nicht funktionsfähig; muß aber gequotet werden, wenn es im Text als Zeichen stehend gefunden werden soll).
`$' Das Dollarzeichen steht für das Zeilenende.
` \' Der Backslash quotiert jedes Sonderzeichen. Um den Punkt selbst darstellen zu können, schreiben Sie ` \.'; ebenso ` \\', ` \∧', ` \$'. Sonderzeichen müssen grundsätzlich quotiert werden.
`*' Wenn einem Zeichen ein `*' folgt, bedeutet das, daß das letzte Zeichen garnicht auftritt, oder sich beliebig oft wiederholen darf. `fo*' findet `f', `fo', `foo', `fooo' usw.
`+' Wie `*', jedoch muß das letzte Zeichen mindestens einmal auftreten. `fo*' findet `fo', `foo', `fooo' usw.
`-' Das Minuszeichen dient der Bereichsangabe innerhalb der Zeichenkette in eckigen Klammern.
`&' Symbolisiert den Textabschnitt, auf den das Suchmuster zutrifft. Kann im Ersatztext verwendet werden.
`[ ]' Eine Zeichenkette in eckigen Klammern steht für ein Zeichen. Welchen Wert dieses Zeichen haben darf, beschreibt der Klammerinhalt. Wenn das erste Zeichen ein `∧' ist, sind diese Zeichen von der Suche ausgeschlossen. Z.B.: [xyz] besagt,daß das Zeichen an dieser Stelle nur `x', `y', `z' sein darf. [∧xyz] sagt, daß das Zeichen an dieser Stelle weder `x' noch `y' noch `z' sein darf. Ein Zeichenbereich kann durch `-' angegeben werden. Beachten Sie bitte, daß [a-z] jedes alphabetische Zeichen, aber [z-a] überhaupt kein alphabetisches Zeichen findet. Ziffern werden mit [0-9] angegeben. Dabei sind auch Einschränkungen möglich, z.B. [7-9] (also nur 7,8,9). Das gleiche gilt auch für Buchstaben, z.B. [m-z], oder [∧a-bd-z?] sucht nur Buchstabe `c', alle Ziffern, sowie Sonderzeichen außer `?'. Die Reihenfolge der Zeichen in der Klammer spielt keine Rolle.

In der Hilfebox können Sie diese Sonderzeichen und ihre Bedeutung noch einmal nachlesen, falls Sie sie gerade mal nicht genau wissen sollten.

ANMERKUNG: Die Sonderzeichen werden innerhalb eines Zeichensatzes nicht gesondert interpretiert; das Caret `∧' wird nur dann als Negation gewertet, wenn es direkt am Anfang des Zeichensatzes steht (also direkt hinter dem `['). Das `$' ist wird nur an letzter Stelle stehend richtig bewertet. Das Caret `∧' für den Zeilenanfang ist implementiert, aber nicht funktionsfähig, weil nach einer Fundstelle innerhalb einer Zeile noch weiter gesucht wird, und daher der GREP-Funktion ein neuer Zeilenanfang vorgegaukelt wird.
Die Verknüpfung von Regulären Ausdrücken ist wieder ein Regulärer Ausdruck.

Die Suche mit regulären Ausdrücken ist nicht trivial und erfordert ein gewisses Maß an Übung. Es kann auch sein, daß bestimmte Ausdrücke nicht gefunden werden, weil man dafür das Suchmuster nicht formulieren kann. GREP ist also auch nicht `allfindend'.